package modelo.servicios;

import java.util.ArrayList;
import modelo.centrales.CentralElectrica;
import modelo.edificios.Edificio;
import modelo.interfaces.BrindadoresDeServicio;
import modelo.interfaces.ConstruibleTerrestre;
import modelo.mapa.Mapa;
import modelo.mapa.Ubicacion;

public class AbastecedorDeServiciosPorRadio {
        
    public void brindarServicioAConstruccionesDelRadioDeAbastecimiento(BrindadoresDeServicio bomberosOCentral)
    {
        int filaInicial = bomberosOCentral.obtenerRegionDeAbastecimiento().obtenerUbicacion().obtenerCoordenadaX();
        int columnaInicial = bomberosOCentral.obtenerRegionDeAbastecimiento().obtenerUbicacion().obtenerCoordenadaY();
        int filaFinal = bomberosOCentral.obtenerRegionDeAbastecimiento().obtenerDimension().obtenerCantidadFilas() + filaInicial;
        int columnaFinal = bomberosOCentral.obtenerRegionDeAbastecimiento().obtenerDimension().obtenerCantidadColumnas() + columnaInicial;
        Ubicacion ubicacionAAbastecer;
        
        for(int i = filaInicial ; i < filaFinal ; i++)
        {
            for(int j = columnaInicial ; j < columnaFinal ; j++)
            {
                ubicacionAAbastecer=new Ubicacion(i,j);
                ConstruibleTerrestre unaConstruccionTerrestre = Mapa.getInstance().obtenerHectareaSegunUbicacion(ubicacionAAbastecer).obtenerConstruccionTerrestre();
                if(unaConstruccionTerrestre != null)
                {
                    bomberosOCentral.brindarServicio(unaConstruccionTerrestre);
                }
            }
        }
    }
    
    public int obtenerCapacidadAbastecimientoRestante(CentralElectrica central)
    {
		int capacidadAbastecimientoRestante = central.obtenerCapacidadDeAbastecimientoMaxima();
        int filaInicial = central.obtenerRegionDeAbastecimiento().obtenerUbicacion().obtenerCoordenadaX();
        int columnaInicial = central.obtenerRegionDeAbastecimiento().obtenerUbicacion().obtenerCoordenadaY();
        int filaFinal = central.obtenerRegionDeAbastecimiento().obtenerDimension().obtenerCantidadFilas() + filaInicial;
        int columnaFinal = central.obtenerRegionDeAbastecimiento().obtenerDimension().obtenerCantidadColumnas() + columnaInicial;
        Ubicacion ubicacionAAbastecer;
        
        for(int i = filaInicial ; i < filaFinal ; i++)
        {
            for(int j = columnaInicial ; j < columnaFinal ; j++)
            {
                ubicacionAAbastecer=new Ubicacion(i,j);
                ConstruibleTerrestre unaConstruccionTerrestre = Mapa.getInstance().obtenerHectareaSegunUbicacion(ubicacionAAbastecer).obtenerConstruccionTerrestre();
                if( (unaConstruccionTerrestre != null) && (unaConstruccionTerrestre.obtenerCentralQueAbastece() == central ) )
                {
                	capacidadAbastecimientoRestante -= unaConstruccionTerrestre.obtenerConsumo();
                }
            }
        }
        
        ArrayList<Ubicacion> ubicacionesLimitrofesALaLineaDeTension;		
		for (RedElectrica redElectrica : central.obtenerRedesElectricas())
		{
			for (LineaDeTension lineaDeTension : redElectrica.obtenerListaDeLineasDeTension())
			{
				ubicacionesLimitrofesALaLineaDeTension = Mapa.getInstance().obtenerUbicacionesLimitrofes(lineaDeTension.obtenerUbicacion());
				for(Ubicacion ubicacionLimitrofe : ubicacionesLimitrofesALaLineaDeTension)
				{
					ConstruibleTerrestre edificio = Mapa.getInstance().obtenerHectareaSegunUbicacion(ubicacionLimitrofe).obtenerConstruccionTerrestre();
					if ((edificio != null) && (edificio.obtenerCentralQueAbastece() == central))
					{
                    	capacidadAbastecimientoRestante -= edificio.obtenerConsumo();
					}					
				}
			}
		} 
		return capacidadAbastecimientoRestante;
    }
    
    private boolean centralEstaAbasteciendoAEdificioMedianteLineasDeTension(Edificio edificio,CentralElectrica centralElectrica)
    {
    	ArrayList<Ubicacion> ubicacionesLimitrofesALaLineaDeTension;		
		for (RedElectrica redElectrica : centralElectrica.obtenerRedesElectricas())
		{
			for (LineaDeTension lineaDeTension : redElectrica.obtenerListaDeLineasDeTension())
			{
				ubicacionesLimitrofesALaLineaDeTension = Mapa.getInstance().obtenerUbicacionesLimitrofes(lineaDeTension.obtenerUbicacion());
				for(Ubicacion ubicacionLimitrofe : ubicacionesLimitrofesALaLineaDeTension)
				{
					ConstruibleTerrestre edificioEncontrado = Mapa.getInstance().obtenerHectareaSegunUbicacion(ubicacionLimitrofe).obtenerConstruccionTerrestre();
					if ((edificioEncontrado == edificio) &&(edificioEncontrado.obtenerCentralQueAbastece() == centralElectrica))
					{
                    	return true;
					}					
				}
			}
		}  
		return false;
    }

	public boolean centralEstaAbasteciendoAlEdificio(Edificio edificio,CentralElectrica centralElectrica) 
	{
		if ( (Mapa.getInstance().construccionPerteneceARegion(centralElectrica.obtenerRegionDeAbastecimiento(), edificio.obtenerUbicacion())) 
			|| (this.centralEstaAbasteciendoAEdificioMedianteLineasDeTension(edificio, centralElectrica)) )
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	public void dejarDeBrindarServicioAEdificiosDelRadio(CentralElectrica centralElectrica)
	{
        int filaInicial = centralElectrica.obtenerRegionDeAbastecimiento().obtenerUbicacion().obtenerCoordenadaX();
        int columnaInicial = centralElectrica.obtenerRegionDeAbastecimiento().obtenerUbicacion().obtenerCoordenadaY();
        int filaFinal = centralElectrica.obtenerRegionDeAbastecimiento().obtenerDimension().obtenerCantidadFilas() + filaInicial;
        int columnaFinal = centralElectrica.obtenerRegionDeAbastecimiento().obtenerDimension().obtenerCantidadColumnas() + columnaInicial;
        Ubicacion ubicacionAAbastecer;
        
        for(int i = filaInicial ; i < filaFinal ; i++)
        {
            for(int j = columnaInicial ; j < columnaFinal ; j++)
            {
                ubicacionAAbastecer=new Ubicacion(i,j);
                ConstruibleTerrestre unaConstruccionTerrestre = Mapa.getInstance().obtenerHectareaSegunUbicacion(ubicacionAAbastecer).obtenerConstruccionTerrestre();
                if(unaConstruccionTerrestre != null)
                {
                	unaConstruccionTerrestre.cortarSuministroDeEnergia(centralElectrica);
                }
            }
        }
    }     
}